//https://pintia.cn/problem-sets/1577541762083844096/exam/problems/1577541980263149575
//二分答案+简单dp（验证答案）
//题意：有n个可以建基站的城市，首尾前一个位置，后一个位置已有基站（即0和n+1位置），
//每个城市都有满意度，如果建立基站则可获得相应城市的满意度，现给一个满意度要求，求能获得要求满意度的基站间最小距离的最大值，如不能满足则输出-1
//思路：可行距离区间为1（每个城市都建）到n+1（一个都不建），由于距离越大，可获得的满意度越小，可以进行二分每次找区间中间值验证可行性，据此修改区间
//验证使用dp，dp[i]表示到i为止的满意度最大和，对于一个位置如果可建基站（即满足i-x>=0&&i+x<=n+1），则满意度最大和为dp[i]和dp[i-x]+a[i]间的最大值
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=200050;
int a[MAXN]={0};
ll dp[MAXN];
int n;
ll w;
int check(int x){
//  直接间隔验证，思路错误
//     ll ans=0;
//     int i;
//     for(i=0;i+2*x<=n+1;){
//         ll temp=a[i+x]+a[i+x+x];
//         int ni=i;
//         for(int j=i+x+1;j<i+x+x;j++){
//             if(a[j]>temp){
//                 ans+=a[j];
//                 i=j;
//             }
//         }
//         if(ni==i){
//             ans+=temp;
//             i+=x;
//         }
//     }
//     if(i+2*x==n+1){
//         ans+=a[i+x];
//     }
//     if(w<=ans) return 1;
//     else return 0;
//         ll ans=0;
//     for(int i=0;i+x<n+1;i+=x){
//         ans+=a[i];
//     }
//     if(w<=ans) return 1;
//     else return 0;
    //memset(dp,0,sizeof(dp));
    dp[0]=0;
    for(int i=1;i<=n;i++){
        dp[i]=dp[i-1];
        if(i-x>=0&&i+x<=n+1) dp[i]=max(dp[i],dp[i-x]+a[i]);//状态转移
    }
    if(dp[n]>=w) return 1;
    else return 0;
}
int main(){
    cin>>n>>w;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    int l=1,r=n+1;
    if(!check(1)) printf("-1\n");//如果全建不行则方案不可行
    else if(w==0) printf("%d\n",n+1);//如果要求值为0则可以不建
    else {
        while(l<r){
            int mid=(l+r+1)/2;
            if(!check(mid)) r=mid-1;
            else l=mid;//二分修改区间
        }
        printf("%d\n",l);
    }
}